/*
对应后端的 TestAgentBus。
负责封装 acquireVsCodeApi。
负责 postMessage 发送消息。
负责监听 message 事件并分发（不再是巨大的 switch case）。
*/
// 立即执行函数表达式（IIFE）
(function() {
    'use strict'; // 启用 JavaScript 的严格模式。

    class VSCodeAdapter {
        constructor() {
            // @ts-ignore
            this.vscode = acquireVsCodeApi();
            this.listeners = {}; // 消息监听器映射
            this._initListener();
        }

        /**
         * 发送消息到后端扩展
         * @param {string} type - 消息类型
         * @param {Object} [payload] - 消息负载
         */
        post(type, payload = {}) {
            this.vscode.postMessage({
                type,
                ...payload
            });
        }

        /**
         * 注册消息监听器，订阅后端的消息
         * @param {string} type - 消息类型
         * @param {Function} callback - 回调函数
         */
        on(type, callback) {
            if (!this.listeners[type]) {
                this.listeners[type] = []; // 初始化type类型的监听器数组
            }
            this.listeners[type].push(callback); // 添加回调函数到监听器数组
        }

        /**
         * 初始化全局消息监听
         * 扩展后端 (发送方): 调用 webview.postMessage({ ... }) 方法，并传入一个包含数据的对象。
         * VS Code 宿主环境: 接收到这个调用，它会将你传入的对象包装成一个 MessageEvent 事件。
         * Webview 前端 (接收方): VS Code 的 Webview 宿主会在 Webview 的 window 对象上触发一个 'message' 事件，并将包装好的 MessageEvent 对象作为参数传递给所有监听了 'message' 事件的处理函数。
         * 你的 VSCodeAdapter: 你之前注册的 window.addEventListener('message', (event) => { ... }) 监听器捕获到这个事件。
         * 事件处理与分发: 你的代码从 event.data 中取出你最初发送的那个消息对象（包含 type 字段的那个），然后根据 message.type 找到并执行对应的回调函数。
         */
        _initListener() {
            window.addEventListener('message', (event) => {
                const message = event.data; // 后端传来的消息
                const handlers = this.listeners[message.type]; // 获取对应类型的监听器数组
                
                if (handlers) {
                    handlers.forEach(handler => {
                        try {
                            handler(message); // 调用回调函数,处理扩展发送的消息
                        } catch (error) {
                            console.error(`Error handling message type ${message.type}:`, error);
                        }
                    });
                } else {
                    console.warn('Unhandled message type:', message.type);
                }
            });
        }

        /**
         * 清理所有监听器
         */
        dispose() {
            this.listeners = {};
            console.log('[VSCodeAdapter] Disposed');
        }
    }

    // 暴露到全局，以便其他模块使用
    window.VSCodeAdapter = VSCodeAdapter;
})();